package 代码记录.校招笔试真题.笔试真题_2022;

import java.util.HashMap;
import java.util.Map;

/**
 * @author zx
 * @create 2022-08-27 23:14
 */
public class 使数组变成交替数组的最少操作数_2170 {
    /**
     * 京东、网易
     * @return 官方思路,代码是最适合自己的
     */
    public int minimumOperations(int[] nums) {
        Map<Integer,Integer> map1 = new HashMap<>();//奇数
        Map<Integer,Integer> map2 = new HashMap<>();//偶数
        for(int i = 0;i < nums.length;i++){
            if(i % 2 == 1){
                map1.put(nums[i],map1.getOrDefault(nums[i],0) + 1);
            }else{
                map2.put(nums[i],map2.getOrDefault(nums[i],0) + 1);
            }
        }
        int[][] odd = helper(map1);
        int[][] even = helper(map2);
        if(odd[0][0] != even[0][0]){
            return nums.length - odd[0][1] - even[0][1];
        }else{
            return Math.min(nums.length - odd[0][1] - even[1][1],
                    nums.length - odd[1][1] - even[0][1]);
        }
    }
    //统计{[出现频数最高的数,频数最高数的出现次数],[出现频数次高的数,频数次高数的出现次数]}
    private int[][] helper(Map<Integer,Integer> map){
        int[][] res = new int[2][2];
        for(Map.Entry<Integer,Integer> entry : map.entrySet()){
            int key = entry.getKey();
            int value = entry.getValue();
            if(value > res[0][1]){//存在频数更高的key
                res[1][1] = res[0][1];//将最大值放到次大值
                res[0][0] = key;
                res[0][1] = value;
            }else if(value > res[1][1]){
                res[1][0] = key;
                res[1][1] = value;
            }
        }
        return res;
    }
}
